<script type="text/javascript">
	function pasarVariables(pagina, nombres) {
  pagina +="?";
  nomVec = nombres.split(",");
  for (i=0; i<nomVec.length; i++)
    pagina += nomVec[i] + "=" + escape(eval(nomVec[i]))+"&";
  pagina = pagina.substring(0,pagina.length-1);
  location.href=pagina;
}
</script>
	<h2>Cap&iacute;tulo 7 DATA PUMP</h2>
<br />
<p class="definicion" align="justify">
 &nbsp;&nbsp;Es un mecanismo que sirve para transmitir informacion entre un esquemo a otro bien dentro de la base de datos bien entre dos base de datos diferentes. Podemos comparar Data Pump a los antiguos sistemas de import export, a diferencia de estos el comando no se ejecuta en el cliente sino que se ejecuta en el servidor.
<br /><br />
Podemos utilizar Data Pump bien sobre linea de comandos utilizando: expdp y impdp, o utilizando el paquete DBMS_DATAPUMP.
<br /><br />
Antes de entrar en materia con Data Pump tenemos que explicar el concepto de Objetos tipo directorio. Estos no son objetos de esquema, los podemos entender como un enlace que va a tener la base de datos para poder dejar el resultado de nuestras operaciones con DATA PUMP.
<br /><br />
Para crear un objeto de usuario en Windows haremos:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
sql > CREATE DIRECTORY dpump_dir AS 'G:\datadumps';
</p></pre></blockquote>
<p class="definicion" align="justify">
Una vez creado el directorio, le tenemos que dar privilegios de lectura y escritura sobre ese directorio al usuario que va a ejecutar el Data Pump.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
sql > GRANT read, write ON DIRECTORY dpump_dir TO PUBLIC;
</p></pre></blockquote>
<br />
<h3><b>EXPDP</b></h3>
<p class="definicion" align="justify">
 &nbsp;&nbsp;Data Pump puede trabajar en varios modos, database, schema, table, tablespace. En el modo database, se exporta toda la base de datos incluyendo cuentas de usuario, sinonimos publicos, roles, profiles, etc. En el modo schema y table, todos los datos y los metadatos de la lista de esquemas o tablas proporcionadas se exportan. Por &uacute;ltimo en el modo tablespace se exportaran todos los datos y metadatos de los objetos del tablespace proporcionados.
<br /><br />
Ejecutamos un expdp en modo database:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
 > expdp system/oracle full=Y dumpfile=dpump_dir:fulla%U.dmp filesize=10M logfile=dpump_dir:full.log
</p></pre></blockquote>
<p class="definicion" align="justify">
Con este comando estamos haciendo:
</p>
<blockquote>
- system/oracle: Nos estamos conectando a la base de datos con el usuario de system y con el password oracle.<br />
- full=Y: Indicamos que el export de la base de datos es completa.<br />
- dumpfile=dpump_dir:fulla%U.dmp filesize 10M: vamos a crear ficheros fullaXX.dmp en el directorio dpump_dir, donde XX sera respectivamente 01, 02 segun se vayan alcanzando el tama&ntilde;o de 10M configurado en el parametro filesize.<br />
- logfile=dpump_dir:full.log: Refleja los prasos que se han ido dando para hacer el export.<br />
</blockquote>
<p class="definicion" align="justify">
Ejecutamos un expdp en modo esquema:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
> expdp system/oracle schemas=MOGU dumpfile=dpump_dir:schema%U.dmp filesize=1M logfile=dpump_dir:schema.log
</p></pre></blockquote>
<p class="definicion" align="justify">
La unica diferencia con el modo anterio es que utilizamos el parametro schemas para indicar que esquemas queremos exportar. En el log creado nos indica las tablas que se han exportado y las filas que contenian.
<br /><br />
Ejecutamos en expdp en modo tabla:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
> expdp system/oracle dumpfile=dpump_dir:table%U.dmp tables=MOGU.PRUEBA1 nologfile=y
</p></pre></blockquote>
<p class="definicion" align="justify">
En resumen en el comando expdp podemos encontrarnas con los siguientes parametros de configuracion:
</p>
<blockquote>
- full=y: Indica que el export de la base de datos va a ser completa.<br />
- schemas=schemas_list: Indicamos separados por comas los esquemas de usuario que queremos exportar.<br />
- tables=tables_list: En el modo table, indicamos separados por comas las lista de tablas que queremos exportar.<br />
- tablesspaces=tablesspaces_list : Separados por comas los tablespaces que queremos exportar.<br />
- content=[METADATA_ONLY|DATA_ONLY|ALL]: Indicamos si exportamos solo los metadatos o solo los datos o todo.<br />
- dumpfile=dir:file: En dir indicamos el directorio y en file el fichero donde se van a guardar los datos exportados.<br />
- filesize=file_size: Tama&ntilde;o maximo de los ficheros generados en el export.<br />
- logfile=dir:file: Directorio y nombre del fichero donde queremos que almacene el log.<br />
- directory=dir: Par indicar por defecto el nombre del directorio.<br />
- nologfile=y: Indicamos que no queremos que se guarde ningun log.<br />
- parfile=dir:file: Le indicamos el fichero donde se encuentran almacenados los parametros para hacer el export.<br />
</blockquote>

<h3><b>IMPDP</b></h3>
<p class="definicion" align="justify">
Para importar los datos que han sido exportados por expdp podemos utilizar el comando IMPDP. Siempre podremos realizar imports de exports que hayan sido realizados y que contengan los objetos que queremos importar. Es decir que podemos importar un esquema de usuario de un export de toda la base de datos, tambien podremos hacer un impdp de una tabla de un expdp hecho de un esquema.

<br /><br />
Importamos las sentencias DDL de un export una base de datos a un fichero .SQL:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
> impdp system/oracle full=y dumpfile=dpump_dir:FULLA%U.DMP nologfile=y sqlfile=dpump_dir:FULL.SQL
</p></pre></blockquote>
<p class="definicion" align="justify">
Hacemos el import de un esquema de usuario utilizando un DB LINK.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
> impdp system/password network_link=prod schemas="HR" remap_schema="HR:HR_TEST" content=metadata_only logfile=dpump_dir:HR_TEST.imp
</p></pre></blockquote>
<p class="definicion" align="justify">
Leemos los datos de HR y copiamos solo los datos de la tabla HR.DEPARTAMENTS.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
> impdp system/password network_link=prod schemas="HR" remap_schema="HR:HR_TEST" content=data_only include=TABLE:"= 'DEPARTMENTS'" 
logfile=chap7:HR_TEST.imp
</p></pre></blockquote>
<p class="definicion" align="justify">
Con este ejemplo almacenamos en el fichero FULL.SQL las sentencias DDL del export realizado de toda la base de datos.
<br /><br />
Los comandos que nos podemos encontrar en IMPDP son:
</p>
<blockquote>
- full=y: Indica que el export de la base de datos va a ser completa.<br />
- schemas=schemas_list: Indicamos separados por comas los esquemas de usuario que queremos importoar.<br />
- tables=tables_list: En el modo table, indicamos separados por comas las lista de tablas que queremos importoar.<br />
- tablesspaces=tablesspaces_list : Separados por comas los tablespaces que queremos importoar.<br />
- content=[METADATA_ONLY|DATA_ONLY|ALL]: Indicamos si exportamos solo los metadatos o solo los datos o todo.<br />
- dumpfile=dir:file: En dir indicamos el directorio y en file el fichero de donde se van a obtener los datos.<br />
- logfile=dir:file: Directorio y nombre del fichero donde queremos que guarde el log.<br />
- directory=dir: Par indicar por defecto el nombre del directorio.<br />
- nologfile=y: Indicamos que no queremos que se guarde ningun log.<br />
- parfile=dir:file: Le indicamos el fichero donde se encuentran almacenados los parametros para hacer el export.<br />
- sqlfile=dir:file: En este fichero escribiremoss las sentnecias DDL del fichero de export que hayamos elegido.<br />
- reuse_datafile=[Y|N]: Sirve para configurar si se desea o no sobreescribir los datafiles anteriores en sentencias CREATE TABLESPACE.<br />
- remap_datafile=source:target: Sirve para darle nombre al datafile que se va a crear. Donde source es el datafile del fichero de export, mientras que target es el nuevo nombre para el datafile.<br />
- remap_schema=source:target: Al igual que en el caso anterior sirve para cambiar el esquema de nombre. donde Source es el nombre del esquema en el fichero de export, mientras que target es el nomrbre que el queremos dar al nuevo esquema.<br />
- remap_tablespace=source:target. Como en los casos anteriores se utiliza para cambiar el tablespace de nombre.<br />
- include=object_list. Aqui incluiremos los objetos que queremos incluir en el import.<br />
- exclude=object_list. O tambien podemos indicar que objetos queremos excluir.<br />
</blockquote>
<br />
<h3><b>DBMS_DATAPUMP</b></h3>

<p class="definicion" align="justify">
Mostramos un ejemplo  de la utilizacion de este paquete para exportar datos:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
DECLARE
 h1 NUMBER; -- handle for the Data Pump session
BEGIN

-- Obtain a handle to an export Data Pump session
h1 := dbms_datapump.open (
operation => 'EXPORT' -- export not import
,job_mode => 'SCHEMA'); -- schema mode
-- ,job_mode => 'FULL'); -- database mode
-- ,job_mode => 'TABLE'); -- table mode
-- ,job_mode => 'TABLESPACE'); -- tablespace mode

-- define the log file
dbms_datapump.add_file(
handle => h1 -- from the OPEN call
,filename => 'MOGU.out' -- file name
,directory => 'DPUMP_DIR' -- database directory object
,filetype =>dbms_datapump.ku$_file_type_log_file);

-- define the dump file
dbms_datapump.add_file(
handle => h1 -- from the OPEN call
,filename => 'MOGU.dmp' -- file name
,directory => 'DPUMP_DIR' -- database directory object
,filetype => dbms_datapump.ku$_file_type_dump_file);

-- define the schemas to export
dbms_datapump.metadata_filter(
handle => h1 -- from the OPEN call
,name => 'SCHEMA_EXPR' -- schema name filter
-- ,name => 'INCLUDE_NAME_EXPR' -- table name filter
-- ,name => 'EXCLUDE_NAME_EXPR' -- table name filter
-- ,name => 'TABLESPACE_EXPR' -- tablespace name filter
,value => 'IN(''MOGU'')'); -- name list

-- invoke Data Pump
dbms_datapump.start_job(handle => h1); -- from the OPEN call

-- run the job in the background
dbms_datapump.detach(handle => h1);

END;
</p></pre></blockquote>
<p class="definicion" align="justify">
En este ejemplo estamos viendo como se hace el exporto del esquema de usuario MOGU. Para realizar el export utilizando el paquete DBMS_DATAPUMP tenemos que utilizar varias funciones:
</p>
<blockquote>
- open: Indicamos la operacion y el modo en el que vamos a operar, en nuestro caso hacemos un EXPORT en modo schema.<br />
- add_file: Esta funcion parametrizada con filetype=>dbms_datapump.ku$_file_type_log_file, indicamos el nombre y la ubicacion del fichero de log.<br />
- add_file: Esta funcion parametrizada con filetype=>dbms_datapump.ku$_file_type_dump_file, indicamos el nombre y la ubicacion del fichero de resultados.<br />
- start_job: Ejecutamos el export.<br />
- detach: Hacemos que se ejecute en segundo plano y que nos devuelva inmediatamente el control.<br />
</blockquote>
<p class="definicion" align="justify">
Utilizamos DBMS_DATAPUMP para importar datos:
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
DECLARE
h1 NUMBER; -- handle for the Data Pump session
BEGIN

-- Obtain a handle to an import Data Pump session
h1 := dbms_datapump.open (
operation => 'IMPORT' -- import not export
,job_mode => 'SCHEMA' -- schema mode
,remote_link=>'PROD'); -- db_link name

-- define the schemas to import
dbms_datapump.metadata_filter(
handle => h1 -- from the OPEN call
,name => 'SCHEMA_EXPR' -- schema name filter
,value => 'IN(''HR'')'); -- name list

-- define the schema remapping
dbms_datapump.metadata_remap(
handle => h1 -- from the OPEN call
,name => 'REMAP_SCHEMA' -- change schema referencess
-- ,name => 'REMAP_TABLESPACE' -- change tablespace refs
-- ,name => 'REMAP_DATAFILE' -- change datafiel refs
,old_value => 'HR' -- source value
,value => 'HR_TEST'); -- target value

-- Do not import data (only metadata)
dbms_datapump.data_filter(
handle => h1 -- from the OPEN call
,name => 'INCLUDE_ROWS' -- data filter name
,value => 0); -- do not include data

-- define the log file
dbms_datapump.add_file(
handle => h1 -- from the OPEN call
,filename => 'HR_TEST.imp' -- file name
,directory => 'CHAP7' -- database directory object
,filetype =>dbms_datapump.ku$_file_type_log_file);

-- invoke Data Pump
dbms_datapump.start_job(
handle => h1); -- from the OPEN call

-- run the job in the background
dbms_datapump.detach(handle => h1);
END;
</p></pre></blockquote>
<p class="definicion" align="justify">
En este ejemplo estamos viendo como se hace el import del esquema de usuario HR utilizando un DBLINK y almacenandolo con el nuevo nombre de HR_TEST Para realizar el export utilizando el paquete DBMS_DATAPUMP tenemos que utilizar varias funciones:
</p>
<blockquote>
- open: Indicamos la operacion y el modo en el que vamos a operar, en nuestro caso hacemos un IMPORT en modo schema.<br />
- metadata_filter: utilizamos esta funcion para cambiarle el nombre al esquema.<br />
- data_filter: A&ntilde;adimos el filtro INCLUDE_ROWS que a un valor 0 indica que solo va a importar los metadatos.<br />
- add_file: Guarda el log en HR_TEST.imp<br />
- start_job: Ejecutamos el export.<br />
- detach: Hacemos que se ejecute en segundo plano y que nos devuelva inmediatamente el control.<br />
</blockquote>
<br />
<h3><b>MONITORIZAR PROCESOS DATA PUMP</b></h3>
<p class="definicion" align="justify">
Para monitorizar el proceso de Data Pump podemos utilizar la siguiente query.
</p>
<blockquote style="COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif"><pre><p>
sql> SELECT owner_name owner, job_name ,operation,job_mode,state FROM dba_datapump_jobs;
</p></pre></blockquote>
<p class="definicion" align="justify">
En el state veremos que pasa por los estados de DEFINING y EXECUTING.
</p>

</div>